﻿/*
 *      CentroVentasCore32  - CVCore32.dll
 *      
 *      Desarrollado por:
 *                      Francisco Acevedo.
 *                      David Avila.
 *                      José Pérez.
 *                      
 *      Todos los derechos reservados.
 */

/*
 *      CLASE: Proveedor   
 * Notas de versión:
 * 
 * [09-01-2012]
 *      -   Creacion de la clase.
 * [11-01-2012]
 *      -   Sistema EntityFramework.
 * [19-01-2012]
 *      -   Añadido funcion Agregar Proveedor.
 * [20-01-2012]
 *      -   Implemetado sistema de rollback en transacciones que lo requieran.
 *      -   Lee Json Generado para obtener el proveedor especificado.
 *      -   Actualiza estado actual del proveedor.
 */
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Net.Json;



namespace CVCore32.Class.Funciones.Proveedores
{

    public class Proveedor
    {

        #region Metodos Estaticos

        /// <summary>
        /// Comprueba que el rut entregado corresponda a un rut registrado como proveedor.
        /// </summary>
        /// <param name="rut">Rut proveedor a evaluar.</param>
        /// <returns>True en caso de que exista.</returns>
        public static bool ExisteProveedor(string rut)
        {
            if (!String.IsNullOrWhiteSpace(rut))
            {
                rut = rut.Replace(".", "");

                CVCore32.Class.Core.Sesion sesion = CVCore32.Class.Core.Sesion.GetInstace;
                Data.electrondbEntities context;
                if (sesion.ServidorWeb)
                {
                    context = new Data.electrondbEntities("Data Source=72.18.135.49, 1533;Initial Catalog=electrondb;User Id=JotaEmePM;Password=ez881010;");
                }
                else
                {
                    context = new Data.electrondbEntities();
                }

                var prov = (from pro in context.Proveedor
                            where pro.Rut == rut
                            select pro.ProveedorId).Count();

                if (prov != 0)
                    return true;
                else
                    return false;
            }
            else
            {
                return false;
            }
        }

        public static Data.Proveedor getProveedor(string rut)
        {
            if (string.IsNullOrWhiteSpace(rut))
            {
                throw new Exception("Proveedor erroneo");
            }
            else
            {
                CVCore32.Class.Core.Sesion sesion = CVCore32.Class.Core.Sesion.GetInstace;
                Data.electrondbEntities context;
                if (sesion.ServidorWeb)
                {
                    context = new Data.electrondbEntities("Data Source=72.18.135.49, 1533;Initial Catalog=electrondb;User Id=JotaEmePM;Password=ez881010;");
                }
                else
                {
                    context = new Data.electrondbEntities();
                }

                Data.Proveedor proveedor = (from p in context.Proveedor
                                            where p.Rut == rut
                                            select p).FirstOrDefault();
                return proveedor;
            }
        }

        public static Data.Proveedor getProveedor(int Id)
        {
            CVCore32.Class.Core.Sesion sesion = CVCore32.Class.Core.Sesion.GetInstace;
            Data.electrondbEntities context;
            if (sesion.ServidorWeb)
            {
                context = new Data.electrondbEntities("Data Source=72.18.135.49, 1533;Initial Catalog=electrondb;User Id=JotaEmePM;Password=ez881010;");
            }
            else
            {
                context = new Data.electrondbEntities();
            }


            Data.Proveedor proveedor = (from p in context.Proveedor
                                        where p.ProveedorId == Id
                                        select p).FirstOrDefault();
            return proveedor;
        }

        public static IBindingList getProveedoresList(bool Inactivos)
        {
            CVCore32.Class.Core.Sesion sesion = CVCore32.Class.Core.Sesion.GetInstace;
            Data.electrondbEntities context;
            if (sesion.ServidorWeb)
            {
                context = new Data.electrondbEntities("Data Source=72.18.135.49, 1533;Initial Catalog=electrondb;User Id=JotaEmePM;Password=ez881010;");
            }
            else
            {
                context = new Data.electrondbEntities();
            }

            IBindingList proveedores;
            if (Inactivos)
            {
                proveedores = ((from p in context.Proveedor
                                select new
                                {
                                    p.ProveedorId,
                                    p.Rut,
                                    p.Nombre,
                                    p.Giro,
                                    p.Vendedor,
                                    p.Telefono,
                                    p.Direccion1,
                                    p.Direccion2,
                                    p.Comuna1.NombreComuna,
                                    p.Email,
                                    p.Web,
                                    p.Catalogo,
                                    p.Creado,
                                    p.Estado1.EstadoDescripcion
                                }) as IListSource).GetList() as IBindingList;
            }
            else
            {
                proveedores = ((from p in context.Proveedor
                                where p.Estado == 1
                                select new
                                {
                                    p.ProveedorId,
                                    p.Rut,
                                    p.Nombre,
                                    p.Giro,
                                    p.Vendedor,
                                    p.Telefono,
                                    p.Direccion1,
                                    p.Direccion2,
                                    p.Comuna1.NombreComuna,
                                    p.Email,
                                    p.Web,
                                    p.Catalogo,
                                    p.Creado,
                                    p.Estado1.EstadoDescripcion
                                }) as IListSource).GetList() as IBindingList;
            }


            return proveedores;
        }

        public static IBindingList getProveedoresList(string buscar, bool Inactivos)
        {
            CVCore32.Class.Core.Sesion sesion = CVCore32.Class.Core.Sesion.GetInstace;
            Data.electrondbEntities context;
            if (sesion.ServidorWeb)
            {
                context = new Data.electrondbEntities("Data Source=72.18.135.49, 1533;Initial Catalog=electrondb;User Id=JotaEmePM;Password=ez881010;");
            }
            else
            {
                context = new Data.electrondbEntities();
            }
            IBindingList proveedores;
            if (Inactivos)
            {
                proveedores = ((from p in context.Proveedor
                                where (p.Rut.Contains(buscar) || p.Nombre.Contains(buscar) || p.Giro.Contains(buscar) || p.Vendedor.Contains(buscar))
                                select new
                                {
                                    p.ProveedorId,
                                    p.Rut,
                                    p.Nombre,
                                    p.Giro,
                                    p.Vendedor,
                                    p.Telefono,
                                    p.Direccion1,
                                    p.Direccion2,
                                    p.Comuna1.NombreComuna,
                                    p.Email,
                                    p.Web,
                                    p.Catalogo,
                                    p.Creado,
                                    p.Estado1.EstadoDescripcion
                                }) as IListSource).GetList() as IBindingList;
            }
            else
            {
                proveedores = ((from p in context.Proveedor
                                where p.Estado == 1
                                where (p.Rut.Contains(buscar) || p.Nombre.Contains(buscar) || p.Giro.Contains(buscar) || p.Vendedor.Contains(buscar))
                                select new
                                {
                                    p.ProveedorId,
                                    p.Rut,
                                    p.Nombre,
                                    p.Giro,
                                    p.Vendedor,
                                    p.Telefono,
                                    p.Direccion1,
                                    p.Direccion2,
                                    p.Comuna1.NombreComuna,
                                    p.Email,
                                    p.Web,
                                    p.Catalogo,
                                    p.Creado,
                                    p.Estado1.EstadoDescripcion
                                }) as IListSource).GetList() as IBindingList;
            }
            return proveedores;
        }

        public static void CrearProveedor(string rut, string nombre, string giro, string vendedor, string telefono, string dir1, string dir2, int comuna, string email, string web, string catalogo, string comentarios)
        {
            CVCore32.Class.Core.Sesion sesion = CVCore32.Class.Core.Sesion.GetInstace;

            if (sesion.ServidorWeb)
            {
                using (Data.electrondbEntities context = new Data.electrondbEntities("Data Source=72.18.135.49, 1533;Initial Catalog=electrondb;User Id=JotaEmePM;Password=ez881010;"))
                {
                    context.Connection.Open();
                    using (var transaction = context.Connection.BeginTransaction())
                    {
                        try
                        {
                            DateTime creado = DateTime.Now;
                            Data.Proveedor prov = new Data.Proveedor()
                            {
                                Rut = rut,
                                Nombre = nombre,
                                Giro = giro,
                                Vendedor = vendedor,
                                Telefono = telefono,
                                Direccion1 = dir1,
                                Direccion2 = dir2,
                                Comuna = comuna,
                                Email = email,
                                Web = web,
                                Catalogo = catalogo,
                                Creado = creado,
                                Comentarios = comentarios,
                                Estado = 1
                            };
                            context.AddToProveedor(prov);
                            context.SaveChanges();
                            transaction.Commit();
                        }
                        catch (Exception ex)
                        {
                            transaction.Rollback();
                            throw new Exception(ex.InnerException.ToString());
                        }
                    }
                }
            }
            else
            {
                using (Data.electrondbEntities context = new Data.electrondbEntities())
                {
                    context.Connection.Open();
                    using (var transaction = context.Connection.BeginTransaction())
                    {
                        try
                        {
                            DateTime creado = DateTime.Now;
                            Data.Proveedor prov = new Data.Proveedor()
                            {
                                Rut = rut,
                                Nombre = nombre,
                                Giro = giro,
                                Vendedor = vendedor,
                                Telefono = telefono,
                                Direccion1 = dir1,
                                Direccion2 = dir2,
                                Comuna = comuna,
                                Email = email,
                                Web = web,
                                Catalogo = catalogo,
                                Creado = creado,
                                Comentarios = comentarios,
                                Estado = 1
                            };
                            context.AddToProveedor(prov);
                            context.SaveChanges();
                            transaction.Commit();
                        }
                        catch (Exception ex)
                        {
                            transaction.Rollback();
                            throw new Exception(ex.InnerException.ToString());
                        }
                    }
                }
            }
        }

        public static List<string> LeerProveedorJson(string jsoncode)
        {
            List<string> lista = new List<string>();
            JsonTextParser parser = new JsonTextParser();
            JsonObject obj = parser.Parse(jsoncode);
            foreach (JsonObject field in obj as JsonObjectCollection)
            {
                string name = field.Name;
                string value = string.Empty;
                string type = field.GetValue().GetType().Name;

                // try to get value.
                switch (type)
                {
                    case "String":
                        value = (string)field.GetValue();
                        break;

                    case "Double":
                        value = field.GetValue().ToString();
                        break;

                    case "Boolean":
                        value = field.GetValue().ToString();
                        break;

                    default:
                        // in this sample we'll not parse nested arrays or objects.
                        throw new NotSupportedException();
                }

                lista.Add(value);
            }
            return lista;
        }

        public static bool CambiarEstado(int ProveedorId, Utiles.Estado estado)
        {
            CVCore32.Class.Core.Sesion sesion = CVCore32.Class.Core.Sesion.GetInstace;

            if (sesion.ServidorWeb)
            {
                using (Data.electrondbEntities context = new Data.electrondbEntities("Data Source=72.18.135.49, 1533;Initial Catalog=electrondb;User Id=JotaEmePM;Password=ez881010;"))
                {
                    context.Connection.Open();
                    using (var transaction = context.Connection.BeginTransaction())
                    {
                        try
                        {
                            Data.Proveedor pro = (from p in context.Proveedor
                                                  where p.ProveedorId == ProveedorId
                                                  select p).FirstOrDefault();

                            if (estado == Utiles.Estado.Activo) pro.Estado = 1;
                            if (estado == Utiles.Estado.Inactivo) pro.Estado = 0;

                            context.SaveChanges();
                            transaction.Commit();
                        }
                        catch (Exception ex)
                        {
                            transaction.Rollback();
                            throw new Exception(ex.InnerException.ToString());
                        }
                    }
                }
            }
            else
            {
                using (Data.electrondbEntities context = new Data.electrondbEntities())
                {
                    context.Connection.Open();
                    using (var transaction = context.Connection.BeginTransaction())
                    {
                        try
                        {
                            Data.Proveedor pro = (from p in context.Proveedor
                                                  where p.ProveedorId == ProveedorId
                                                  select p).FirstOrDefault();

                            if (estado == Utiles.Estado.Activo) pro.Estado = 1;
                            if (estado == Utiles.Estado.Inactivo) pro.Estado = 0;

                            context.SaveChanges();
                            transaction.Commit();
                        }
                        catch (Exception ex)
                        {
                            transaction.Rollback();
                            throw new Exception(ex.InnerException.ToString());
                        }
                    }
                }
            }


            return true;
        }

        #endregion
    }
}

